package com.ygqh.baby.service;

import com.ygqh.baby.ao.*;
import com.ygqh.baby.kids.entity.bo.KidsProductExt;
import com.ygqh.baby.model.*;
import com.ygqh.baby.po.YgProduct;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

public interface YgProductService {

    List<YgProduct> find(QueryInfo queryInfo, String productName, Long groupId, String productStatus, Long supplierId, Boolean isPreDate);

    List<YgProductModel> findDetailModelByGroup(Long groupId);

    int findCount();

    YgProduct findById(Long id);

    List<YgProduct> findByIds(Long[] ids);

    int deleteSoft(Long[] ids);

    int deleteSoft(Long id);

    int save(YgProduct ygProduct);

    int update(YgProduct ygProduct);

    int saveOrUpdate(YgProduct ygProduct);

    /**
     * 商品详情 for m站
     *
     * @param id
     * @return
     */
    YgProductModel findDetailModel(Long id);

    /**
     * 更新销售状态（上下架）
     *
     * @param id
     * @param status
     * @return
     */
    int updateSaleStatus(Long id, ProductStatus status);

    int updateSaleStatus(YgProduct ygProduct);

    /**
     * 根据产品Id获取产品信息（有SKU列表）
     *
     * @param id
     * @return
     */
    YgProduct findDetailById(Long id);

    List<YgProduct> findDetailById(List<Long> idList);

    /**
     * 根据分组Id获取产品信息(有SKU列表)
     *
     * @param id
     * @return
     */
    List<YgProduct> findDetailByGroupId(Long id);

    /**
     * 查询sku数组中已下架的sku
     *
     * @param skuIds
     * @return 返回 skuId和productName
     */
    List<Map<String, Object>> findInStockBySkuIds(Long[] skuIds);

    /**
     * 根据productCodes查询某促销下的赠品
     *
     * @param productCodes
     * @param pType
     * @return
     */
    List<YgProduct> findGiftByProductCodes(String[] productCodes, PromotionType pType);

    /**
     * 根据Id查询某促销下的赠品(订单校验使用)
     *
     * @param skuIds
     * @param pType
     * @return
     */
    List<Map<String, Object>> findGiftBySkuIds(Long[] skuIds, PromotionType pType);

    /**
     * 通过productCodes查询商品数据（含该产品下的sku数据）
     *
     * @param productCodes
     * @param pType
     * @return
     */
    List<YgProduct> findByProductCodes(String[] productCodes, PromotionType pType);

    /**
     * 相似商品
     *
     * @param brandName
     * @param categoryId
     * @return
     */
    List<YgSimilarProductModel> findSimilarityProduct(String brandName, Long categoryId);

    /**
     * 查询产品编码是否存在
     *
     * @param productCode
     * @return
     */
    Boolean productCodeExist(String productCode, Long productId);

    /**
     * 运营后台 编辑促销商品时 获取商品列表的数据
     *
     * @param queryInfo
     * @param productName
     * @param groupId
     * @param productStatus
     * @param supplierId
     * @param promotionId   促销活动id 必传项
     * @return
     */
    List<YgProduct> findProductForPromotion(QueryInfo queryInfo, String productName, Long groupId, String productStatus, Long supplierId, Long promotionId,
                                            Boolean isSpecial);

    List<YgProduct> findProductByPromotionId(QueryInfo queryInfo, Long promotionId);

    /**
     * 定时任务 更新商品下架 该产品下所有的sku都没货是才更新
     *
     * @return
     */
    int updateSaleStatusByTask(List<Long> ids);

    /**
     * 获取没有库存的商品（即所有sku库存为0）
     */
    List<Long> findProductNoStock();

    /**
     * 根据用户id查询购买过的商品
     *
     * @param queryInfo
     */
    ResultSet<YgProduct4ShaidanModel> findProduct4ShaidanModel(QueryInfo queryInfo, Long userId);

    /**
     * 全部已上架的壹果商品
     *
     * @param queryInfo
     */
    ResultSet<YgProduct4ShaidanModel> findProductAllModel(QueryInfo queryInfo);

    /**
     * 商品列表页
     *
     * @param queryInfo
     * @param categoryId
     * @param gender
     * @param productName (模糊查询)
     * @param isVip
     */
    ResultSet<YgProduct4ListModel> findList(QueryInfo queryInfo, Long[] categoryId, Boolean isPreProduct, String gender, String productName, String tags,
                                            Boolean isVip, Long supplierId);

    /**
     * 商品列表页-自选礼包
     *
     * @param queryInfo
     */
    @Deprecated
    ResultSet<YgProduct4ListModel> findListByPack(QueryInfo queryInfo, Long packId);

    List<YgProduct4ListModel> findListByPack(QueryInfo queryInfo, Long packId, SalesPlatform salesPlatform);

    /**
     * 判断产品设置为新客价时 是否存在自选包活动
     */
    Boolean IsExistPackByProductId(Long productId);

    /**
     * 最热商品
     *
     * @param queryReq
     * @return
     */
    ResultSet<YgHotProductModel> searchHotProduct(HotProductSaleQueryReq queryReq);

    List<YgHotProductModel> findHotProductList(HotProductSaleQueryReq queryReq);

    int findHotProductCount(HotProductSaleQueryReq queryReq);

    /**
     * 更新预售
     *
     * @param id
     * @param preSaleDate
     * @param handler
     * @return
     */
    int updatePreSaleDate(Long id, Date preSaleDate, String handler);

    /**
     * 查找商品库存数和销售数
     *
     * @return
     */
    List<YgProductSaleNumAndCommentNumModel> findSaleNumAndCommentNum();

    void updateProductSaleNumAndCommentNum(List<YgProductSaleNumAndCommentNumModel> list);

    void updateWholesalePrice(YgProduct product);

    void updateSalesPrice(YgProduct product);

    int updateSalesStatusByProductCode(YgProduct product);

    /**
     * 将商品设置为特例商品
     *
     * @param id        商品id
     * @param isSpecial 是否设置为特例品
     */
    Message siteSpecial(Long id, Boolean isSpecial);

    /**
     * 获取所有的预售商品的skuCode
     *
     * @return
     */
    List<String> findAllPreProductSkuCodes();

    /**
     * 更新成本价
     *
     * @param p
     */
    void updateCostPrice(YgProduct p);

    /**
     * 不返回SKU信息
     *
     * @param id
     * @return
     */
    YgProductModel findDetailModelV2(Long id);

    /**
     * 返回产品列表 普通商品包含特例品
     *
     * @param name
     * @param groupId
     * @param supplierId
     * @return
     */
    List<YgProduct> findOrdinaryOnSaleProducts(String name, Long groupId, Long supplierId);

    List<YgProduct> findProductList(String name, Long groupId, Long supplierId, PromotionType ptype, ProductStatus productStatus);

    /**
     * 获取普通商品信息
     *
     * @param productId
     */
    Long getOrdinaryProductId(Long productId);

    /**
     * 导出商品
     *
     * @param q
     * @param productStatus
     * @param groupId
     * @param isSpecial
     * @param productCode
     * @return
     */
    List<YgProduct> findAllProduct(String q, String productStatus, Long groupId, Boolean isSpecial, String productCode, Boolean isGroup,
                                   PromotionType promotionType, Long supplierId);

    void updatePromotionPrice(BigDecimal price, Long groupId, String updateBy, Date updateTime, BigDecimal shareRate, BigDecimal vipRate, BigDecimal distributionPrice);

    int updateProductStatus(YgProduct ygProduct);

    Map<String, Object> selectProductBySkuId(String skuCode, Long productId);

    List<Map<String, Object>> findProductListBySupplierId(Long supplierId);

    List<YgProduct> selectProductList(QueryInfo queryInfo, String productName, Long groupId, String productStatus, Long supplierId, Boolean isSpecial,
                                      String productCode, Boolean isGroup, PromotionType promotionType, BigDecimal vipPrice, Boolean preSaleDate);

    List<Map<String, Object>> findProductByGroupId(Long supplierId, Long groupId);

    List<YgSkuModel> findSku(Long productId);

    @Deprecated
    ResultSet<YgProduct4ListModel> findListByBmdism(QueryInfo queryInfo, Long bmdismId);

    List<YgProduct4ListModel> findListByBmdism(QueryInfo queryInfo, Long bmdismId, SalesPlatform salesPlatform);

    List<String> findSkuCodeByproductIds(List<Long> productIds);

    /**
     * 根据商品id查询某种促销类型商品信息
     *
     * @param pType
     * @param productId 入参
     * @return YgProduct 返回类型
     * @throws
     * @Title: findProductById
     * @author （guohao）
     * @date 2017年11月15日 下午2:24:01
     * @version V1.0
     */
    YgProduct findProductById(PromotionType pType, Long productId);

    /**
     * 根据商家id修改返利
     *
     * @param shareRate  分享返利
     * @param supplierId 商家id
     */
    int updateRebate(BigDecimal shareRate, Long supplierId);

    List<YgProduct4ListModel> findProduct4ListModelByIds(List<Long> ids);

    List<YgProduct4ListModel> findProduct4ListModelByIds(QueryInfo queryInfo, List<Long> ids,
                                                         SalesPlatform salesPlatform);

    void pushToWDT(Long... id);

    /**
     * 根据skuCode 获取product所有sku信息
     *
     * @param skuCodes
     * @param pType
     * @return List<YgProduct>    返回类型
     * @throws
     * @Title: findBySkuCodes
     * @author （guohao）
     * @date 2018年3月1日 下午7:08:50
     * @version V1.0
     */
    List<YgProduct> findBySkuCodes(PromotionType pType, String... skuCodes);

    /**
     * 根据时间区间查询商品数据（如有需要可扩展字段，指定时间类型 例：创建时间，上架时间）
     *
     * @param startTime
     * @param endTime
     * @param productStatus
     * @return List<YgProduct>    返回类型
     * @throws
     * @Title: findProductByTime
     * @author （guohao）
     * @date 2018年3月2日 上午11:35:33
     * @version V1.0
     */
    List<YgProduct> findProductByTime(QueryInfo queryInfo, Date startTime, Date endTime, PromotionType promotionType, ProductStatus productStatus);

    int countProductByTime(Date startTime, Date endTime, PromotionType promotionType, ProductStatus productStatus);

    /**
     * 获取商品信息（包含商品图片）
     *
     * @param ids
     * @return
     */
    List<YgProduct4ListModel> findProductWithImageByIds(List<Long> ids);

    /**
     * 批量更新商品名称和销售价
     *
     * @param productList
     * @return
     */
    int updateProductNameAndSalePrice(List<YgProduct> productList);

    /**
     * 根据商家统一修改分享返利
     *
     * @param shareRate
     * @param supplierId
     * @return
     */
    int updateShareRateBySupplierId(BigDecimal shareRate, Long supplierId);

    ResultSet<YgProduct4ListModel> findOrdinaryProduct(String q, QueryInfo queryInfo);

    ResultSet<YgProduct4ListModel> findOrdinaryProductNotPack(String q, QueryInfo queryInfo, Long packId);

    /**
     * 只返回 id,productCode,promotionType
     *
     * @param skuCodes
     * @return List    返回类型
     * @author （guohao）
     * @date 2018年6月7日 下午4:45:49
     */
    List<Map<String, Object>> findPidAndPcodeBySkuCodes(String... skuCodes);

    List<ProductInfoForSolr> findProductListForSolr(List<Long> productIds);

    ProductInfoForSolr findProductForSolr(Long productId);

    int updateCategoryAndBasicAttributeByProductCode(Long categoryId, String basicAttribute, List<String> productCodeList);

    int updateCategoryNamesByCategoryId(Long categoryId);

    List<YgProduct4ListModel> findList(ProductListRequestParam param);

    YgProductModel findDetailModelForYjdian(Long id);

    ResultSet<Map<String, Object>> search(QueryInfo queryInfo,
                                          String productName, String groupName, String productStatus,
                                          String supplierName, Boolean isSpecial, String productCode,
                                          Boolean isGroup, Boolean preSaleDate, SalesPlatform salesPlatform);

    Long getSupplierIdByBarcode(String barcode);

    Message pushProductInfoToKids(Long productId, String operator, OffShop... offShops);

    /**
     * 按关键字批量更新产品
     *
     * @param searchKey
     * @param distProductName
     * @param trueName
     * @param date
     * @return
     */
    Message batchUpdateProdctName(String searchKey, String distProductName,
                                  String trueName, Date date);

    /**
     * 按产品ID更新产品名称
     *
     * @param productIds
     * @param distProductName
     * @param trueName
     * @param date
     * @return
     */
    Message batchUpdateProdctByProductIds(String[] productIds,
                                          String distProductName, String trueName, Date date);

    /**
     * 运营系统商品列表页 导出
     *
     * @param q
     * @param productName
     * @param groupName
     * @param productStatus
     * @param supplierName
     * @param special
     * @param productCode
     * @param isGroup
     * @param preDate
     * @param salesPlatform
     * @return
     */
    List<Map<String, Object>> selectProductListToExport(QueryInfo q,
                                                        String productName, String groupName, String productStatus,
                                                        String supplierName, Boolean special, String productCode,
                                                        Boolean isGroup,
                                                        Boolean preDate, SalesPlatform salesPlatform);

    List<YgProduct> findListByName(String distProductName);

    /**
     * 更新商品促销标记
     * <p>
     * 注意： promotionTag 暂时 支持一种促销标签
     * 支持多种的话此方法需调整
     *
     * @param promotionTag 促销标记
     * @param list         商品ID集合
     * @return int
     */
    int updatePromotionTag(String promotionTag, List<Long> list);

    /**
     * 拼团商品列表
     *
     * @param queryInfo     分页
     * @param salesPlatform 销售平台
     * @param tags          拼团相关销售属性
     * @return
     */
    List<ProductModelForGroup> productListByGroupOrder(QueryInfo queryInfo, String salesPlatform, String tags, boolean skipYg);

    /**
     * 壹家店商品列表
     *
     * @param param
     * @return
     */
    List<YgProduct4ListModel> findListForYjdian(ProductListRequestParam param);

    void processProductPriceForYjdian(List<YgProduct4ListModel> result);

    /**
     * 获取新客优惠价
     *
     * @param salesPlatform 平台
     * @return
     */
    BigDecimal getCouponPriceForNewCustom(SalesPlatform salesPlatform);

    /**
     * 运营系统商品列表页
     *
     * @param queryInfo
     * @param productName
     * @param groupName
     * @param productStatus
     * @param supplierName
     * @param isSpecial
     * @param productCode
     * @param isGroup
     * @param preSaleDate
     * @param salesPlatform
     * @return
     */
    List<Map<String, Object>> selectHoutaiProductList(QueryInfo queryInfo,
                                                      String productName, String groupName, String productStatus,
                                                      String supplierName, Boolean isSpecial, String productCode,
                                                      Boolean isGroup, Boolean preSaleDate, SalesPlatform salesPlatform);

    /**
     * 运营系统商品列表页返回行数
     *
     * @param productName
     * @param groupName
     * @param productStatus
     * @param supplierName
     * @param isSpecial
     * @param productCode
     * @param isGroup
     * @param preSaleDate
     * @param salesPlatform
     * @return
     */
    int countHoutaiProductList(String productName, String groupName,
                               String productStatus, String supplierName, Boolean isSpecial,
                               String productCode, Boolean isGroup, Boolean preSaleDate,
                               SalesPlatform salesPlatform);

    /**
     * 查询每个二级分类的最新一个上架商品
     *
     * @param param 参数
     * @return
     */
    List<YgProduct4ListModel> findListGroupBySecondCategory(ProductListRequestParam param);

    /**
     * 查询每个款式的最新一个商家商品
     *
     * @param param
     * @return
     */
    List<YgProduct4ListModel> findListGroupByProductGroup(ProductListRequestParam param);

    List<Product4SelectListModel> findList4Select(ProductSelectListParam selectListParam);

    List<YgProduct> findDetailBySaleTime(Date startTime, Date endTime, SalesPlatform salesPlatform);

    List<KidsProductExt> findProductDataByBarCodeForKids(String[] barcode);
}
